package com.cskaoyan.javase.array._4operation._0traverse;

import java.util.Arrays;

/**
 * 数组的遍历,刚刚我们使用的都是for循环来实现的
 * 实际上,Java当中的for循环实现,还有一种特殊方式
 * 称之为"增强for循环",也叫foreach
 * 语法:
 *      for(数据类型 变量名 : 容器的名字){
 *          // 遍历的遍历体
 *      }
 * 解释:
 *      1.语法当中"容器的名字",表示需要被遍历元素的容器的名字(引用)
 *      2."数据类型" 表示要遍历的容器中,元素的数据类型
 *          比如遍历int数组,这里就填"int"
 *      3."变量名" 表示要遍历的容器中的每一个元素
 *      也就是说,增强for循环是直接遍历容器中的元素
 *      而不是像普通for一样,遍历的是数组的下标
 *
 * 在循环遍历数组时,增强for循环 vs 普通for循环
 * 它们的区别是什么呢?
 *      1.增强for的语法更简洁，并且遍历效率也会更高一点。(和多线程有关)
 *      结合快捷键（iter）使用，做遍历时无疑会更方便。
 *      所以如果有得选,优先选择增强for循环
 *
 *      2.增强for循环中没有使用数组下标，而是直接遍历元素。
 *      当你想要在循环中使用数组下标时，就无法使用增强for了。
 *      比如一个需求是: 求数组的最大值,并且返回该最大值元素所处的下标,这时就无法用增强for.
 *
 *      3.增强for的语法简洁,遍历效率高,这是优点
 *      它的缺点是:
 *      增强for也叫迭代器（iterator）
 *      它仅仅作为一个遍历访问数组/集合容器的工具而存在
 *      在增强for当中是不能修改任何元素的取值的。
 *      增强for遍历容器只能用于访问
 *      不能用于修改
 *      (和多线程有关)
 *
 * @since 17:34
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo3 {
    public static void main(String[] args) {
        String[] arr = {"张三", "李四", "蔡徐坤"};
        // 普通for遍历,遍历下标,快捷键: 数组名.fori
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        System.out.println("---------------------");
        // 增强for循环遍历,直接遍历元素
        // str代表数组容器中的每一个元素,它是一个局部变量
        for (String str : arr) {
            System.out.println(str);
        }
        // 增强for的快捷键: iter
        for (String str : arr) {
            System.out.println(str);
        }

        System.out.println("-------------------");
        int[] arr2 = {1, 2, 3};
        // 普通for是可以修改元素取值的
        for (int i = 0; i < arr2.length; i++) {
            arr2[i] *= 2;
        }
        System.out.println(Arrays.toString(arr2));

        // 增强for无法修改容器中的元素取值
        for (int element : arr2) {
            element *= 2;
        }
        System.out.println(Arrays.toString(arr2));
    }
}
